package com.kly.smartbi.manager;

import cn.hutool.json.JSONUtil;
import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationOutput;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import com.kly.smartbi.model.dto.chart.ChartAddRequest;
import com.kly.smartbi.model.entity.ChartResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * @author admin
 * @date 2025/3/30
 */
@Slf4j
@Component
public class QwenManager {

    @Value("${qwen.apiKey}")
    private String apiKey;

    // region QWen prompt
    private static final String content = "你是一名专业数据分析师和前端工程师（使用Vue3语言），需要根据用户提供的参数生成分析结果和图表配置。请严格按照以下要求执行：\n\n" +
            "输入参数：\n" +
            "1. 分析目标（goal）：用户提供的分析目的（如'分析用户增长趋势'）\n" +
            "2. 名称（name）：图表名称\n" +
            "3. 图表类型（chartType）：指定图表类型（如'折线图'、'柱状图'）\n" +
            "4. 原始数据（chartData）：JSON格式的结构化数据\n\n" +

            "输出要求：\n" +
            "1. 返回标准JSON对象，包含以下字段：\n" +
            "   - option：完整的ECharts配置对象\n" +
            "   - genResult：自然语言分析结论（不超过200字）\n" +
            "2. 自动解析数据，忽略空值和格式错误\n" +
            "3. 图表类型严格匹配用户指定类型\n" +
            "4. 生成符合Vue3组件使用的配置\n" +
            "5. 分析结论需基于数据和分析目标\n\n" +

            "数据规范：\n" +
            "chartData格式示例：\n" +
            "{\n" +
            "  \"columns\": [\"日期\", \"用户\"],\n" +
            "  \"rows\": [\n" +
            "    {\"日期\": \"1\", \"用户\": 10},\n" +
            "    {\"日期\": \"2\", \"用户\": 50},\n" +
            "    {\"日期\": \"3\", \"用户\": 80}\n" +
            "  ]\n" +
            "}\n\n" +

            "请直接输出JSON结果，无需其他说明：\n" +
            "{\n" +
            "  \"option\": {},\n" +
            "  \"genResult\": \"\"\n" +
            "}\n";

    // endregion

    public ChartResult genChartByQwen(ChartAddRequest chartAddRequest, String csvData) {
        // 拼接生成prompt
        String goal = chartAddRequest.getGoal();
        String name = chartAddRequest.getName();
        String chartType = chartAddRequest.getChartType();
        String message = "分析目标：" + goal + "\n" +
                "名称：" + name + "\n" +
                "图表类型：" + chartType + "\n" +
                "原始数据：" + csvData;
        Generation gen = new Generation();
        Message systemMsg = Message.builder()
                .role(Role.SYSTEM.getValue())
                .content(content)
                .build();
        Message userMsg = Message.builder()
                .role(Role.USER.getValue())
                .content(message)
                .build();
        GenerationParam param = GenerationParam.builder()
                // 若没有配置环境变量，请用百炼API Key将下行替换为：.apiKey("sk-xxx")
                .apiKey(apiKey)
                // 此处以qwen-plus为例，可按需更换模型名称。模型列表：https://help.aliyun.com/zh/model-studio/getting-started/models
                .model("qwen-max")
                .messages(Arrays.asList(systemMsg, userMsg))
                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                .build();
        try {
            GenerationResult result = gen.call(param);

            ChartResult chartResult = new ChartResult();
            for (GenerationOutput.Choice choice : result.getOutput().getChoices()) {
                String jsonContent = choice.getMessage().getContent();
                chartResult = JSONUtil.toBean(jsonContent, ChartResult.class);
            }
            return chartResult;
        } catch (Exception e) {
            log.error("调用QWen失败", e);
        }
        return null;
    }
}
